/*
 * @Author: Bertels Nick c1019387
 * @Description: (s01,s02,s03,s04)
 * @Date: 22/11/2013
 */
package views.createViews;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

import controllers.createControllers.ToevoegenPersoneelController;
import controllers.uiControllers.PortalController;
import views.parts.MyTextField;
import net.sourceforge.jdatepicker.impl.JDatePanelImpl;
import net.sourceforge.jdatepicker.impl.JDatePickerImpl;
import net.sourceforge.jdatepicker.impl.UtilDateModel;
import core.logic.services.utilServices.ValidatieService;
import core.models.dataModels.createModels.ToevoegenPersoneelModel;
import core.models.domainModel.Eigenaar;
import net.miginfocom.swing.MigLayout;

import java.util.ArrayList;
import java.util.ResourceBundle.Control;

import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.border.LineBorder;

import java.awt.Color;


public class ToevoegenPersoneelView extends JFrame
{
	private static final long serialVersionUID = 1L;

	private ToevoegenPersoneelModel _model;	
	//Gebruik gemaakt van aangepast tekstvelden waar je de lengte van de maximale lengte kan meegeven
	//Lieven Drijkoningen
	private MyTextField txtNaam;		
	private MyTextField txtVoornaam;
	private MyTextField txtGeboorteDatum;
	private MyTextField txtPersoneelsNummer;
	private MyTextField txtPersoneelType;
	private MyTextField txtStraat;
	private JTextField txtHuisnummer;
	private MyTextField txtBus;
	private MyTextField txtGemeente;
	private MyTextField txtPostcode;
	private MyTextField txtStaatProvincie;
	private MyTextField txtLand;
		
	public ToevoegenPersoneelView(ToevoegenPersoneelModel model) 
	{
		this._model = model;
		
		
		
		
		//Opmaken labels
		JLabel lblNaam = new JLabel("Naam : ");		
		JLabel lblVoornaam = new JLabel("Voornaam : ");
		JLabel lblGeboorteDatum = new JLabel("Geboorte datum : ");
		JLabel lblPersoneelsNummer = new JLabel("Personeels nummer : ");
		JLabel lblPersoneelType = new JLabel("Personeel type : ");
		JLabel lblStraat = new JLabel("Straat : ");
		JLabel lblHuisnummer = new JLabel("Huisnummer : ");
		JLabel lblBus = new JLabel("Bus : ");
		JLabel lblGemeente = new JLabel("Gemeente : ");
		JLabel lblPostcode = new JLabel("Postcode : ");
		JLabel lblStaatprovincie = new JLabel("Staat/Provincie : ");
		JLabel lblLand = new JLabel("Land : ");
		JLabel lblEigenaar = new JLabel("Eigenaar : ");
		JLabel lblNationaliteiten = new JLabel("Nationaliteit(en):");
		
		
		
		
		//Opmaken textvelden
		
		txtNaam = new MyTextField();
		txtNaam.setColumns(10);
		txtNaam.setName("Naam");
		txtNaam.setLengte(150);
		
		txtVoornaam = new MyTextField();
		txtVoornaam.setLengte(150);
		txtVoornaam.setColumns(10);
		txtVoornaam.setName("Voornaam");
				
		txtGeboorteDatum = new MyTextField();
		txtGeboorteDatum.setColumns(10);
		txtGeboorteDatum.setName("Geboortedatum");
				
		txtPersoneelsNummer = new MyTextField();
		txtPersoneelsNummer.setLengte(45);
		txtPersoneelsNummer.setColumns(10);
		txtPersoneelsNummer.setName("Personeelsnummer");
				
		txtPersoneelType = new MyTextField();
		txtPersoneelType.setLengte(1);
		txtPersoneelType.setColumns(10);
		txtPersoneelType.setName("Personeeltype");
		
		txtStraat = new MyTextField();
		txtStraat.setLengte(150);
		txtStraat.setColumns(10);
		txtStraat.setName("Straat");
		
		txtHuisnummer = new JTextField();
		txtHuisnummer.setColumns(10);
		txtHuisnummer.setName("Huisnummer");
		txtBus = new MyTextField();
		txtBus.setLengte(10);
		txtBus.setColumns(10);
		txtBus.setName("Bus");		
		
		txtGemeente = new MyTextField();
		txtGemeente.setLengte(150);
		txtGemeente.setColumns(10);
		txtGemeente.setName("Gemeente");
		
		txtPostcode = new MyTextField();
		txtPostcode.setLengte(20);
		txtPostcode.setColumns(10);
		txtPostcode.setName("Postcode");
		
		txtStaatProvincie = new MyTextField();
		txtStaatProvincie.setLengte(150);
		txtStaatProvincie.setColumns(10);
		txtStaatProvincie.setName("Staat");
		
		txtLand = new MyTextField();
		txtLand.setLengte(150);
		txtLand.setColumns(10);		
		txtLand.setName("Land");
		
		//Date Time Picker
		JDatePanelImpl datePanel = new JDatePanelImpl(new UtilDateModel(null));
		final JDatePickerImpl picker = new JDatePickerImpl(datePanel);
		
		//List voor de nationaliteiten aanmaken en opvullen
		//Lieven Drijkoningen
		final JList<String> list = new JList<String>();
		list.setBorder(new LineBorder(new Color(0, 0, 0)));
		list.setLayoutOrientation(JList.VERTICAL);
		
		
		DefaultListModel<String> listModel = new DefaultListModel<String>();		
		for(String s: model.getMogelijkeNationaliteiten())
		{
			listModel.addElement(s);
		}
		list.setModel(listModel);
		JScrollPane scrollPane = new JScrollPane(list);		
		
		//Combobox eigenaars aanmaken en opvullen
		final JComboBox<Eigenaar> cmbEigenaar = new JComboBox<Eigenaar>();
		for(Eigenaar dezeEigenaar: _model.get_mogelijkeEigenaars())
		{
			cmbEigenaar.addItem(dezeEigenaar);
		}
		
		//Aanmaken van knop toevoegen
		//Hierna volgt de validatie
		//Lieven Drijkoningen
		final JButton btnToevoegen = new JButton("Toevoegen");
		
		btnToevoegen.addActionListener(new ActionListener() 
		{
			int res = 0;
			public void actionPerformed(ActionEvent e) 
			{					
				if(e.getSource()== btnToevoegen)
				{
					//UC 09.01 S05,S06 Validatie
					//Lieven Drijkoningen					
					if(validateTextFields(ToevoegenPersoneelView.this))
					{	
						
						//UC 09.01 S07 Als actor wil ik een melding krijgen om het toevoegen te bevestigen of te annuleren
						//Lieven Drijkoningen C1017178
						
						res = JOptionPane.showConfirmDialog(null, "Toevoegen? " + txtNaam.getText() ,"Persoon",JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE);
						
						//UC 09.01 S08 Als actor wil ik dat de gegevens worden toegevoegd in de database bij het bevestigen van het toevoegen 
						//Lieven Drijkoningen
						
						if(res == JOptionPane.YES_OPTION)
						{	
							//Toevoegen van alle verschillende nationaliteiten in arraylist
							//Lieven Drijkoningen C1017178
							ArrayList<String> national = new ArrayList<String>();	
							
							for(String s: list.getSelectedValuesList())
							{
								national.add(s);
							}
							//Opvullen van datum string voor db
							//Lieven Drijkoningen
							String datum = "";						
							
							datum = picker.getModel().getDay() + "/" + (picker.getModel().getMonth() + 1) + "/" + picker.getModel().getYear(); 
							//Opvullen van het model
							
							_model.set_bus(txtBus.getText());
							_model.set_eigenaar((Eigenaar)cmbEigenaar.getSelectedItem());							
							_model.set_geboorteDatum(datum);
							_model.set_gemeente(txtGemeente.getText());
							_model.set_huisnummer(Integer.parseInt(txtHuisnummer.getText()));
							_model.set_land(txtLand.getText());
							_model.set_naam(txtNaam.getText());
							_model.set_personeelsNummer(txtPersoneelsNummer.getText());
							_model.set_personeelType(txtPersoneelType.getText());
							_model.set_postcode(txtPostcode.getText());
							_model.set_stadProvincie(txtStaatProvincie.getText());
							_model.set_straat(txtStraat.getText());
							_model.set_voornaam(txtVoornaam.getText());	
							_model.setNationaliteiten(national);
							_model = validateNew(_model);
							ToevoegenPersoneelController.insertPersoneel(_model);
							ToevoegenPersoneelController.handleView(_model);
							ToevoegenPersoneelController.showView();
						}
					}
				}
			}
		});
		
		//Annuleren knop toegevoegd
		//Sluit venster
		//Lieven Drijkoningen
		final JButton btnAnnuleren = new JButton("Annuleren");
		btnAnnuleren.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent e) 
			{
				if(e.getSource() == btnAnnuleren)
				{
					ToevoegenPersoneelController.handleView(_model);
					PortalController.showView();
				}
			}
		});
		
		
		// Jente Bosmans 11/1/2014
		//zet de beginfocus op het eerste element en stelt de tab-volgorde in
		txtNaam.grabFocus();
		txtNaam.setNextFocusableComponent(txtVoornaam);
		txtVoornaam.setNextFocusableComponent(picker);
		picker.setNextFocusableComponent(txtPersoneelsNummer);
		txtPersoneelsNummer.setNextFocusableComponent(txtPersoneelType);
		txtPersoneelType.setNextFocusableComponent(cmbEigenaar);
		cmbEigenaar.setNextFocusableComponent(txtStraat);
		txtStraat.setNextFocusableComponent(txtHuisnummer);
		txtHuisnummer.setNextFocusableComponent(txtBus);
		txtBus.setNextFocusableComponent(txtGemeente);
		txtGemeente.setNextFocusableComponent(txtPostcode);
		txtPostcode.setNextFocusableComponent(txtStaatProvincie);
		txtStaatProvincie.setNextFocusableComponent(txtLand);
		txtLand.setNextFocusableComponent(list);
		list.setNextFocusableComponent(btnToevoegen);
		btnToevoegen.setNextFocusableComponent(btnAnnuleren);
		
		
		//Lieven Vandepere 29/11/20013: Library voor deze layout toegevoegd, je kan het nu veilig gebruiken.
		getContentPane().setLayout(new MigLayout("", "[120px][120px][120px][120px]", "[20px][20px][23px][20px][23px][23px][20px][100,grow][23px]"));
		getContentPane().add(lblVoornaam, "cell 0 1,alignx left,aligny center");
		getContentPane().add(lblNaam, "cell 0 0,alignx left,aligny center");
		getContentPane().add(lblGeboorteDatum, "cell 0 2,alignx left,aligny top");
		getContentPane().add(lblPersoneelsNummer, "cell 0 3,alignx left,aligny center");
		getContentPane().add(lblPersoneelType, "cell 0 4,alignx left,aligny center");
		getContentPane().add(lblEigenaar, "cell 0 5,alignx left,aligny center");
		getContentPane().add(cmbEigenaar, "cell 1 5,growx,aligny top");
		getContentPane().add(txtPersoneelType, "cell 1 4,growx,aligny top");
		getContentPane().add(txtPersoneelsNummer, "cell 1 3,growx,aligny top");
		getContentPane().add(picker, "cell 1 2,growx,aligny top");
		getContentPane().add(txtVoornaam, "cell 1 1,growx,aligny top");
		getContentPane().add(txtNaam, "cell 1 0,growx,aligny top");
		getContentPane().add(lblHuisnummer, "cell 2 1,alignx left,aligny center");
		getContentPane().add(lblStraat, "cell 2 0,alignx left,aligny center");
		getContentPane().add(lblBus, "cell 2 2,alignx left,aligny center");
		getContentPane().add(lblGemeente, "cell 2 3,alignx left,aligny center");
		getContentPane().add(lblPostcode, "cell 2 4,alignx left,aligny center");
		getContentPane().add(lblStaatprovincie, "cell 2 5,alignx left,aligny center");
		getContentPane().add(lblLand, "cell 2 6,alignx left,aligny center");
		getContentPane().add(lblNationaliteiten, "cell 2 7,alignx left,aligny center");
		getContentPane().add(txtStaatProvincie, "cell 3 5,growx,aligny top");
		getContentPane().add(txtPostcode, "cell 3 4,growx,aligny top");
		getContentPane().add(txtGemeente, "cell 3 3,growx,aligny top");
		getContentPane().add(txtStraat, "cell 3 0,growx,aligny top");
		getContentPane().add(txtBus, "cell 3 2,growx,aligny top");
		getContentPane().add(txtHuisnummer, "cell 3 1,growx,aligny top");
		getContentPane().add(txtLand, "cell 3 6,growx,aligny top");	
		getContentPane().add(scrollPane, "flowx,cell 3 7,growx");
		//getContentPane().add(list, "cell 3 7,grow");
		getContentPane().add(btnToevoegen, "cell 0 8,growx,aligny top");
		getContentPane().add(btnAnnuleren, "cell 1 8,growx");
		
		
		
	}
		//UC 09.05 Validatie gegevens
		//Gebruik gemaakt van een aangepast textfield, met een extra attribuut om de maximale lengte van de ingegeven tekst mee te geven
		//Lieven Drijkoningen
		public boolean validateTextFields(ToevoegenPersoneelView view)	
		{			
			for(Component c: view.getContentPane().getComponents())
			{			
				if(c instanceof MyTextField)
				{	
					String naam = "";
					naam = c.getName();					
					if((!naam.equalsIgnoreCase("Huisnummer")))
					{
						if((!naam.equalsIgnoreCase("Bus")))
						{
							if(!ValidatieService.isPresentAndLength((MyTextField)c, ((MyTextField) c).getLengte(), c.getName()))
							{						
								return false;
							}								
						}
						else						
						{							
							if(!ValidatieService.isLength((MyTextField)c, ((MyTextField) c).getLengte(), c.getName()))
							{
								return false;
							}
						}
						if(naam.equalsIgnoreCase("Nationaliteiten"))
						{
							if(!ValidatieService.isPresentAndLength((MyTextField)c, ((MyTextField) c).getLengte(), naam))
							{
								return false;
							}
							else
							{
								String nat = ((MyTextField) c).getText();	
								if(!ValidatieService.isLandCode((MyTextField)c,nat))
								{
									return false;
								}								
							}
						}								
					}
				}
				else 
					if (c instanceof JTextField)
					{
						if(!ValidatieService.isPositiveInteger((JTextField)c, c.getName()))
						{
							return false;						
						}
					}				
					else 
						if(c instanceof JDatePickerImpl)
						{
							JTextField j = new JTextField();
							j = ((JTextField)((JDatePickerImpl) c).getComponents()[0]);
							if(!ValidatieService.isPresent(j, "Datum"))
							{
								return false;
							}						
						}
						else
							if(c instanceof JList<?>)
							{
								if(((JList<?>) c).getSelectedValuesList().size()<=0)
								{
									JOptionPane.showMessageDialog(null, "Selecteer minstens 1 nationaliteit");
									return false;
								}
							}
			}	
			return true;
		}
		//UC 09.05 Validatie bestaand adres, persoon, werknemer		
		//Lieven Drijkoningen
		public ToevoegenPersoneelModel validateNew(ToevoegenPersoneelModel model)
		{
			model = ToevoegenPersoneelController.validateBestaandeGegevens(model);
			return model;		
		}
}
	
	
	
	